#pragma once

namespace AVUI {

struct InheritablePropertyChangeInfo
{
public:
#pragma region Internal Methods
    InheritablePropertyChangeInfo()
    {

    }

    InheritablePropertyChangeInfo(DependencyProperty* pProperty, const EffectiveValueEntry& oldEntry, const EffectiveValueEntry& newEntry)
    {
        m_pProperty = pProperty;
        m_oldEntry = oldEntry;
        m_newEntry = newEntry;
    }
#pragma endregion Internal Methods

public:

#pragma region Internal Properties

    EffectiveValueEntry get_NewEntry() const { return m_newEntry; }
    EffectiveValueEntry get_OldEntry() const { return m_oldEntry; }
    DependencyProperty* get_Property() const { return m_pProperty; }

#pragma endregion Internal Properties

#pragma region Private Fields

    EffectiveValueEntry m_newEntry;
    EffectiveValueEntry m_oldEntry;
    DependencyProperty* m_pProperty;

#pragma endregion Private Fields
};

class InheritedPropertyChangedEventArgs : public EventArgs
{
public:
    DECLARE_ELEMENT(InheritedPropertyChangedEventArgs, EventArgs);

#pragma region Internal Methods
    InheritedPropertyChangedEventArgs(InheritablePropertyChangeInfo* pInfo) : m_info(*pInfo) { }
#pragma endregion Internal Methods

#pragma region Internal Properties
    InheritablePropertyChangeInfo get_Info() { return m_info; }
#pragma endregion Internal Properties

private:
#pragma region Private Fields
    InheritablePropertyChangeInfo m_info;
#pragma endregion Private Fields
};

DEFINE_EVENTHANDLER(InheritedPropertyChanged);

};

